﻿/*
 * Created by SharpDevelop.
 * User: Renzo
 * Date: 05/10/2011
 * Time: 03:43 a.m.
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Drawing;
using System.Windows.Forms;
using Business_Logic;
using System.Collections.Generic;
using Business_Entity;

namespace PetSoft.GUI.GestRecursos
{
	/// <summary>
	/// Description of GUIEstadoPedidoProductos.
	/// </summary>
	public partial class GUIEstadoPedidoProductos : Form
	{
		private BEPedidoAbastecimiento codPedido;
		private List<BELineaPedidoAbastecimiento> detPedido;
		
		public GUIEstadoPedidoProductos()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			this.confBTN.Enabled = false;
            for (int i=0;i<BLInfo.usuarioActual.Rol.Privilegio.Count;i++){
                if ((new BLPrivilegio()).existePrivilegio(2,"GREC","ESPP",BLInfo.UsuarioActual.Rol.Privilegio)){
                    this.confBTN.Enabled = true;
                }                
            }
			//this.col
			llenaTablaPed();
			this.listPedTBL.DoubleClick += new EventHandler(doble_click);
			this.detPedTBL.DoubleClick += new EventHandler(doble_clickDet);
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		
		private void doble_click(object sender, EventArgs e){
			int aux = this.listPedTBL.CurrentRow.Index;
			if(((bool)this.listPedTBL[0, aux].Value) == true){
				this.listPedTBL[0, aux].Value = false;
			}
			else{
				this.listPedTBL[0, aux].Value = true;
			}
		}
		
		private void doble_clickDet(object sender, EventArgs e){
			int aux = this.detPedTBL.CurrentRow.Index;
			if(((bool)this.detPedTBL[0, aux].Value) == true){
				this.detPedTBL[0, aux].Value = false;
			}
			else{
				this.detPedTBL[0, aux].Value = true;
			}
		}
		
		void llenaTablaPed(){
			BETienda tiendaAct;
			try{
				tiendaAct = BLInfo.TiendaActual;
				if((tiendaAct.Id==null)||(tiendaAct.Id==0)){
					MessageBox.Show("No se encuentra en una tienda registrada, no puede confirmar productos.");
					this.confBTN.Enabled = false;
					return;
				}
			}
			catch{
				MessageBox.Show("No se encuentra en una tienda registrada, no puede confirmar productos.");
				return;
			}
			//BETienda tiendaAct = BLInfo.TiendaActual;
			BLPedidoAbastecimiento pedido = new BLPedidoAbastecimiento();
			List<BEPedidoAbastecimiento> ped, ped1;
			ped = pedido.getPedidoTotAten(tiendaAct.Id);
			ped1 = pedido.getPedidoParcAten(tiendaAct.Id);
			foreach(BEPedidoAbastecimiento p in ped1){
				ped.Add(p);
			}
			foreach (BEPedidoAbastecimiento p in ped) {			
				this.listPedTBL.Rows.Add(false, "" + p.Codigo, "" + String.Format("{0:dd/MM/yyyy}", DateTime.Parse(p.Fecha.ToString())), "" + p.Estado.Descripcion);
			}
		}
		
		void PedProdAceptBTNClick(object sender, EventArgs e)
		{
			int cont = 0, contAux = 0, index = 0;
			foreach(DataGridViewRow fila in this.listPedTBL.Rows){
        		if(fila.Cells[0].Value != null && (bool)fila.Cells[0].Value){
        			index = contAux;
        			cont++;
        		}      		
        		contAux++;
        	}
			if(cont==0){
				MessageBox.Show("Debe seleccionar algún pedido para ver sus detalles.");
			}
			if(cont>1){
				MessageBox.Show("Solo debe seleccionar solo 1 pedido para ver sus detalles.");
			}
			if(cont==1){
				BLPedidoAbastecimiento blPed = new BLPedidoAbastecimiento();
				int codPed = Int32.Parse(this.listPedTBL[1,index].Value.ToString());
				BEPedidoAbastecimiento ped = blPed.getPedidoByCod(codPed);
				this.codPedido = ped;
				List<BELineaPedidoAbastecimiento> detallePed, detallePedFinal;
				detallePedFinal = new List<BELineaPedidoAbastecimiento>();
				detallePed = blPed.getDetalleByCod(codPed);
				this.detPedido = detallePed;
				BLProveedor prov = new BLProveedor();
				BLProducto blProd = new BLProducto();
				foreach (BELineaPedidoAbastecimiento linea in detallePed) {
				   	BEProveedor pr = blProd.getProveedorByCod(linea.Proveedor.IdProv);
				   	//MessageBox.Show("Detallesfdasdfd:" + linea.Proveedor.IdProv);
				   	linea.Proveedor = pr;
				   	List<BEProducto> pd = blProd.getProductoByCod(linea.Producto.Codigo);
				   	linea.Producto = pd[0];
				   	detallePedFinal.Add(linea);
				}
				//BEProveedor p = prov.BuscarProveedor(1);
				//MessageBox.Show("Detalles:" + p.RazonSocial);
				ped.Detalle = detallePedFinal;
				//MessageBox.Show("Cant Detalle: " + ped.Detalle.Count);
				this.detPedTBL.Rows.Clear();
				foreach (BELineaPedidoAbastecimiento l in ped.Detalle) {
					if((l.Estado.Codigo==4)||(l.Estado.Codigo==5)){
						this.detPedTBL.Rows.Add(false, l.Producto.Codigo, l.Producto.Nombre, l.Cantidad, l.CantidadEnviada, l.CantidadRecibida, l.Estado.Descripcion);
					}
					else{
						this.detPedTBL.Rows.Add(false, l.Producto.Codigo, l.Producto.Nombre, l.Cantidad, l.CantidadEnviada, "", l.Estado.Descripcion);
					}
				}
				if(this.detPedTBL.Rows.Count!=0){
					this.limpBTN.Enabled = true;
					this.confBTN.Enabled = true;
				}
			}			
		}
				
		void LimpBTNClick(object sender, EventArgs e)
		{
			this.detPedTBL.Rows.Clear();
			this.cantPedLBL.Text = "0";			
			this.confBTN.Enabled = false;
			this.limpBTN.Enabled = false;
		}
		
		void ConfBTNClick(object sender, EventArgs e)
		{
			BLLineaPedidoAbastecimiento lPed = new BLLineaPedidoAbastecimiento();
			BLMovimiento mov = new BLMovimiento();
			BETienda t;
			int est, cantFilas, cont = 0, bien = 1;
			
			cantFilas = this.detPedTBL.Rows.Count;
			foreach(DataGridViewRow fila in this.detPedTBL.Rows){
				if(fila.Cells[0].Value != null && (bool)fila.Cells[0].Value && 
				   ((fila.Cells[6].Value.ToString()!="TOTALMENTE RECIBIDO")&&(fila.Cells[6].Value.ToString()!="PARCIALMENTE RECIBIDO"))){
					int codProd = Int32.Parse(fila.Cells[1].Value.ToString());
					int cant = Int32.Parse(fila.Cells[3].Value.ToString());
					int cantEnv = Int32.Parse(fila.Cells[4].Value.ToString());
					int cantRec = 0;
					int codLinea=0;
					try{
						cantRec = Int32.Parse(fila.Cells[4].Value.ToString());
					}
					catch{
						MessageBox.Show("Debe indicar la cantidad recibida del producto " + fila.Cells[1].Value.ToString());
						fila.Cells[5].Selected = true;
						return;
					}
					//Se indica que se recibio la cantidad indicada
					if(cantEnv==0){
						MessageBox.Show("No puede confirmar un pedido con cantidad enviada 0.");
						return;
					}
					if(cantRec>cantEnv){
						MessageBox.Show("La cantidad recibida debe ser menor o igual a la enviada.");
						return;
					}
					t = BLInfo.TiendaActual;
					BLProductoTienda pTie = new BLProductoTienda();
					//int res1 = pTie.					
					//Se registra la entrada de los productos a la tienda
					int res = mov.nuevaEntradaProducto(t.Id, codProd, cantRec);
					if(res==0){
						MessageBox.Show("Se presento un error y no se pudo confirmar el pedido.");
						bien = 0;
						break;
					}
					
					if((cantEnv-cantRec)!=0){
						//hay merma, se debe registrar la perdida de los productos
						int res1 = mov.nuevaMermaProducto(t.Id, codProd, (cantEnv-cantRec));
						//Se cambia el estado de la linea de abastecimiento a parcialmente recibido
						
						if(res1==0){
							MessageBox.Show("Se presento un error y no se pudo confirmar el pedido.");
							bien = 0;
							break;
						}
						foreach (BELineaPedidoAbastecimiento l in this.detPedido) {
							if(l.Producto.Codigo==codProd){
								codLinea = l.CodLinea;
								break;
							}
						}
						lPed.modificaCantidadLineaPedido(this.codPedido.Codigo, codLinea, cantRec);
						int res2 = lPed.modificaEstadoLineaPedido(this.codPedido.Codigo, codLinea, 4);
						if(res2==0){
							MessageBox.Show("Se presento un error y no se pudo actualizar el estado del pedido.");
							bien = 0;
						}
						else{
							bien = 1;
						}
					}
					else{//No hay merma					
						foreach (BELineaPedidoAbastecimiento l in this.detPedido) {
							if(l.Producto.Codigo==codProd){
								codLinea = l.CodLinea;
								break;
							}
						}
						lPed.modificaCantidadLineaPedido(this.codPedido.Codigo, codLinea, cantRec);
						int res3 = lPed.modificaEstadoLineaPedido(this.codPedido.Codigo, codLinea, 5);
						if(res3==0){
							MessageBox.Show("Se presento un error y no se pudo actualizar el estado del pedido.");
							bien = 0;
						}
						else{
							bien = 1;
						}
					}
					//index = contAux;
        			//cont++;
        		}      		
        		//contAux++;
        	}
			if(bien==1){
				MessageBox.Show("Los productos fueron confirmados correctamente.");
			}
		}
		
		void CanBTNClick(object sender, EventArgs e)
		{
			this.Close();
		}
		
	}
}
